等待承诺解决以解决Angular.js中的另一个承诺

时间:2016-12-05 18:58:06

标签: javascript angularjs angular-promise

我有一个嵌套的承诺,一个承诺取决于另一个的结果,因此可以强制Angular.js在解决第二个问题之前解决一个gien承诺。

这是我的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.google.android.gms.common.SignInButton;

public class GoogleLoginButton extends FrameLayout implements View.OnClickListener{

    private SignInButton signInButton;
    private OnClickListener onClickListener;

    public GoogleLoginButton(Context context) {
        super(context);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public GoogleLoginButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        signInButton = new SignInButton(getContext());
        signInButton.setSize(SignInButton.SIZE_STANDARD);
        setGooglePlusButtonText(signInButton, "Test");
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        addView(signInButton, params);
    }

    protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) {
        // Find the TextView that is inside of the SignInButton and set its text
        for (int i = 0; i < signInButton.getChildCount(); i++) {
            View v = signInButton.getChildAt(i);

            if (v instanceof TextView) {
                TextView tv = (TextView) v;
                tv.setText(buttonText);
                return;
            }
        }
    }

    @Override
    public void setOnClickListener(OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
        if(this.signInButton != null) {
            this.signInButton.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
        if(this.onClickListener != null && v == this.signInButton) {
            this.onClickListener.onClick(this);
        }
    }
}

用户和消息都是服务。 User.getAllUsers().then(function(users) { $scope.users = users; for (var i = 0; i < users.length; i++) { console.log('username ' + users[i].username); Message.getUnreadMessages(users[i].username, localStorage.getItem("token")).then(function(messages) { console.log('username in second promise' + users[i].username); $scope.messages.push(messages); }) } }) 显示正确的用户名。 console.log('username '+ users[i].username);抛出错误`:

  

无法读取属性&#39;用户名&#39;未定义的

1 个答案:

答案 0 :(得分:1)

试试这个:

User.getAllUsers().then(function(users) {
    $scope.users = users;
    for (var i = 0; i < users.length; i++) {
      (function(user){
        console.log('username ' + user.username);
        Message.getUnreadMessages(user.username, localStorage.getItem("token")).then(function(messages) {
            console.log('username in second promise' + user.username);
            $scope.messages.push(messages);
        })
      })(users[i]);
    }
})

参见https://developer.mozilla.org/en/docs/Web/JavaScript/Closures,关于闭包和循环的章节。