gpt4 book ai didi

javascript - promise 的返回值不是预期的

转载 作者:行者123 更新时间:2023-11-30 17:16:03 25 4
gpt4 key购买 nike

我有一些逻辑,我试图构建一个“人”对象,我有一个名为 getProvider 的方法,我基本上是从 mongo 获取一个提供者并将其分配给 person.provider.

由于对 mongo 的调用是异步的,因此我尝试使用 promises。除了在我的 .then 方法中,该值在我记录的所有地方似乎都是正确的。它显示 {"source": {}} 我不知道为什么。

这是我的输出:

data = 
MYPROVIDER
provider =
MYPROVIDER
after addProvider
{"source":{}}


...
configDone.promise.then(function () {
return addProvider();
}).then(function() {
console.log('after addProvider');
console.log(JSON.stringify(people[0].provider)); // SHOWS {"source": {}}. WHY IS IT DOING THIS?
callback(null, people);
}).fail(function (err) {
callback(err);
});


function addProvider() {

var promises = [];

people.forEach(function(person){
promises.push(person.provider = getProvider(person.id, db));
});

return Q.all(promises).spread(function(provider) {
console.log('provider = ');
console.log(provider); // SHOWS CORRECT PROVIDER HERE
});
}

// Gets a provider for a specific person id
var getProvider = function(id, db) {

var def = Q.defer();

db.collection('providerLists').findOne({id: id}, function (err, data) {

if (err) {
def.reject(err);
} else {
console.log('data = ');
console.log(data.ListName); // SHOWS CORRECT VALUE
def.resolve(data.ListName);
}
});

return def.promise;
}

最佳答案

people[0].provider 应该指向已解决的 promise 。如果您将 then 处理程序附加到它,您将看到预期的提供程序值:

people[0].provider.then(function(provider) {
console.log(JSON.stringify(provider);
});

如果您想让提供者成为 people 数组中每个人的值,您可以按如下方式更新您的 addProvider 函数:

function addProvider() {

var promises = [];

people.forEach(function(person){
promises.push(getProvider(person.id, db)
.then(function(provider) {
person.provider = provider;
});
});

return Q.all(promises).spread(function(provider) {
console.log('provider = ');
console.log(provider); // SHOWS CORRECT PROVIDER HERE
});
}

关于javascript - promise 的返回值不是预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106184/

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