我有一个嵌套的承诺,一个承诺取决于另一个的结果,因此可以强制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;未定义的
答案 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,关于闭包和循环的章节。