这基本上是我的代码,使用 q :
let d = Q.defer();
let result = {
name: 'peter'
};
d.resolve(result);
return d.promise;
但是,我现在需要根据特定条件执行一个步骤。此步骤调用另一个对象,该对象也返回一个 promise 。所以我有嵌套的 promise ,如果这是正确的术语。
像这样:
let d = Q.defer();
let result = {
name: 'peter'
};
if (someParameter) {
otherService.getValue() // Let's say it returns 'mary'
.then((res) => {
result.name = res;
});
}
d.resolve(result);
return d.promise;
但这不起作用(name
属性仍然是“peter”)。可能是因为我内心的 promise 在稍后的时刻得到了解决?
我也试过这个,但如果我调用返回 promise 的 otherService,它就不起作用。如果我只设置值,它确实有效:
let d = Q.defer();
let result = {
name: 'peter'
};
d.resolve(result);
return d.promise
.then((data) => {
if (someParameter) {
// Works
data.name = 'john';
// Doesn't work
otherService.getValue()
.then((res) => {
data.name = res;
});
}
return data;
});
这里的名字将是“john”,而不是“mary”。
显然我误解了 promises,但我无法理解它。
最佳答案
不推荐使用 deferreds。如果有的话,您应该使用 Q.Promise
构造函数,但您甚至不需要它。只需使用 Q
function创造一个实现您的值(value)的 promise 。
现在您可以(并且应该)将您的代码简化为
let d = someParameter ? otherService.getValue() : Q('peter');
return d.then(res => ({
name: res
}));
关于javascript - 有条件地在另一个 promise 中调用 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618426/