javascript - 有条件地在另一个 promise 中调用 promise

标签 javascript promise q

这基本上是我的代码,使用 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/

相关文章:

javascript - jQuery 从标准 href 链接 CSS/HTML 触发 PhotoSwipe 独占模式

javascript - Angular 中的 ng-src 和 ngFor

javascript - ExtJS ComboBox(配置了 queryMode remote 和 forceSelection true)自动清除输入字段

node.js - q.js : can I stop a function from executing until a promise is fulfilled?

node.js - nodejs 中的异步和 Q promise

javascript - 使用 AJAX 更新 Div 结果丢失更新

angularjs - 如何使用 Protractor 向流量控制队列添加 promise ?

javascript - 如何使用 Promise 处理失败的 ajax 请求

javascript - 如何循环promise函数流程控制

javascript - 如何重构以下代码以使用 q?