承诺,然后绑定问题
Promise.then bind issue
我一直面临着将值绑定到下一个 Promise 的问题。看看下面的代码,它会更好地解释情况。
'use strict';
function FindEvent(eventId) {
console.log('Event:', eventId);
return Promise.resolve({title: 'MyEvent'});
}
function FindUser(userId) {
console.log('User:', userId);
return Promise.resolve({username: 'MyUser'});
}
function MyServiceProblem(payload) {
payload.userId = 'blah';
return FindEvent(payload.eventId)
.then((event) => {
payload.userId = 'test';
// setting a breakpoint here shows
// that the value to payload.userId has been
// assigned, i.e. 'test'
return Promise.resolve(payload);
})
.then(FindUser.bind(this, payload.userId));
// But new value doesn't reaches inside FindUser
}
MyServiceProblem({ // userId is 'blah', why not 'test'
eventId: '456'
});
function MyServiceWorks(payload) {
payload.userId = 'blah';
return new Promise((resolve) => {
payload.userId = 'test';
return resolve(payload);
})
.then(FindUser.bind(this, payload.userId));
// From here, the 'test' value reaches FindUser
}
MyServiceWorks({ // userId is 'test'
eventId: '456'
});
问题是,为什么它绑定的值对于这两种情况都是不同的。两者都完全相同,除了这个是首先解决承诺的部分,然后给payload.userId
赋值。
让我们稍微
分解一下你的代码。你有
function MyServiceProblem(payload) {
payload.userId = 'blah';
return FindEvent(payload.eventId)
.then((event) => {
payload.userId = 'test';
return Promise.resolve(payload);
})
.then(FindUser.bind(this, payload.userId));
}
问题是您的.bind
将在您的回调之前运行。此代码也可以编写为
function MyServiceProblem(payload) {
payload.userId = 'blah';
var firstThenCallback = (event) => {
payload.userId = 'test';
return Promise.resolve(payload);
};
var secondThenCallback = FindUser.bind(this, payload.userId);
return FindEvent(payload.eventId)
.then(firstThenCallback)
.then(secondThenCallback);
}
payload
对象在所有对象之间共享,但payload.userId
在firstThenCallback
有机会执行之前就传递到.bind
中。
而不是使用 .bind
并立即传递值,似乎最简单的解决方案是使用匿名函数,以便稍后只读取userId
值。
function MyServiceProblem(payload) {
payload.userId = 'blah';
return FindEvent(payload.eventId)
.then((event) => {
payload.userId = 'test';
return Promise.resolve(payload);
})
.then(() => FindUser(payload.userId));
}
也完全不清楚你为什么要写这么迂回的承诺代码,但我认为这是一个精简的例子?为什么要用payload
解决,而不仅仅是在该函数中调用FindUser
,例如
function MyServiceProblem(payload) {
payload.userId = 'blah';
return FindEvent(payload.eventId)
.then((event) => {
payload.userId = 'test';
return FindUser(payload.userId);
});
}
相关文章:
- ng绑定和ng href问题.ng href未从控制器加载数据
- 绑定的角度ng-max问题
- 性能问题:通用选择器与单独绑定
- 使用AngularJS UI路由器时出现元素绑定问题
- 数据互绑定问题:转换器只运行一次,无法绑定元素的 ID
- 挖空和显示模块模式的数据绑定问题
- 使用大括号的 Internet Explorer 上的 AngularJS 数据绑定问题
- backbone.js绑定问题
- SAPUI5绑定问题:json文件中维护的列表项链接不起作用
- 绑定的Javascript问题
- 将事件绑定到Bootstrap 3(button.js)按钮无线电时出现问题
- 将javascript绑定到提交按钮时出现问题
- Aurelia类的问题.使用checked.bind绑定
- AngularJS:图片上传+文件阅读器预览.控制器、指令和作用域之间的绑定出现问题
- 挖空 - 单击绑定到对象函数 - 范围问题
- Angular JS(嵌套变量)中的绑定问题
- 触摸事件的挖空事件绑定导致滚动问题
- JavaScript setInterval 范围问题:绑定的替代方案
- 击倒剑道问题绑定通过计算观察
- 奇怪的问题绑定事件与骨干,“;这个“;没有更新