gpt4 book ai didi

javascript - 我如何用 Q 链接嵌套的 promise ?我无法让它们按正确的顺序运行

转载 作者:行者123 更新时间:2023-11-29 22:07:17 24 4
gpt4 key购买 nike

我希望能够将本身可能包含链接方法的方法链接在一起。

日志应显示为“第一、第二、第三”。但是,实际上它是“第二,第三,第一”。

我知道这段代码有点多余,但我只是想了解 promises/node 是如何执行的。我将如何编写本身可以链接在一起的基于 promise 的函数?

    user.increaseReadings(id)
.then(function(val) { console.log("second",val); return user.findById(id); })
.then(function(val) { console.log("third",val); res.json(val); });
}

来自 /models/user 模块:

exports.findById = findById;
function findById(id) {
deferred = Q.defer();

User.findById(id, function(err, doc) {
if (err) return deferred.reject(err);
deferred.resolve(doc);
});

return deferred.promise;
}

exports.increaseReadings = increaseReadings;
function increaseReadings(id) {
deferred = Q.defer();

findById(id).then(function(doc) { <-- here's the problem
doc.readings++;
doc.save(function(err, doc) {
console.log("first");
if (err) return deferred.reject(err);
deferred.resolve(doc);
});
});

return deferred.promise;
}

最佳答案

您可以这样重写 increaseReadings:

function increaseReadings(id) {
return findById(id).then(function(doc) {
console.log(doc);
var deferred = Q.defer();
doc.readings++;
doc.save(function(err, doc) {
console.log("first");
if (err) return deferred.reject(err);
deferred.resolve(doc);
});
return deferred.promise;
});
}

此代码与您编写的代码之间的重要区别在于传递给“then”方法的匿名函数返回一个 promise 。

在大多数 promise 实现中,如果您将 promise 作为处理程序的结果返回,则链中的下一步将不会执行,直到您解决返回的 promise。

关于javascript - 我如何用 Q 链接嵌套的 promise ?我无法让它们按正确的顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com