gpt4 book ai didi

javascript - 如何从 promise 中获取值(value)。回调返回未定义

转载 作者:行者123 更新时间:2023-12-03 02:14:56 24 4
gpt4 key购买 nike

我使用 Promise 来处理异步方法 getPropoalByPeriod但我找不到 obj数据出foo函数其中 console.log(89,foo(mycallback()))打印未定义。请帮助将数据导出到外部,以便我可以处理它们。

function foo(callback) {
var MyPromises = periods.map((p) => {
return new Promise((resolve, reject) => {
myFunctions.getPropoalByPeriod(p.id, localStart, function(err, rows) {
if (err) {
console.log(62, err);
return reject(err);
} else
var obj = {
id: p.id,
name: p.name,
savedServices: rows[0] ? rows[0].services : '',
};
resolve(obj)
})
})
})
Promise.all(MyPromises)
.then((p) => {
callback(p)
})
.catch((err) => console.log(79, err));
}

function mycallback(res) {
console.log(85, res)
return res
}
foo(mycallback)
console.log(89, foo(mycallback()))

这个问题与 SO 上的问题不同。它使用 map() ,与 Promise 或 async/await 的简单示例相比,我无法弄清楚如何应用等待。

最佳答案

then 接受一个函数并将 Promise 的结果发送到该函数(callback 函数的第一个参数)。

Promise 本质上是异步的,它们的输出不是立即可用的。这就是为什么我们使用 then 方法来获取结果。

在您的代码中,mycallback 接收所有 Promise 的结果以及值 res(与值 85 一起打印)就是你从 promise 中得到的。

请记住,因为您对 Promise 数组使用了 Promise.all,所以您会从所有成功的 Promise 中获得一组结果。这意味着 res 是一个数组,而不是单个值。

您的代码还存在其他一些问题。对 foo 方法的第一次调用效果很好,并且正确地打印了结果。但是,您的第二次调用 (console.log(89,foo(mycallback()))) 是不正确的,因为您传递的不是函数给 foo,而是结果向 foo 函数调用 callback()(未定义)。删除该行,一切都应该正常工作。

这是完整的修改后的代码:

function foo() {
var MyPromises = periods.map((p) => {
return new Promise((resolve, reject) => {
myFunctions.getPropoalByPeriod(p.id, localStart, function(err, rows) {
if (err) {
console.log(62, err);
reject(err);
} else {
var obj = {
id: p.id,
name: p.name,
savedServices: rows[0] ? rows[0].services : '',
};
resolve(obj);
}
});
});
});
return Promise.all(MyPromises);
}

// Pure promises:

foo().then(r => console.log(r));

// or using async/await:

async function run() {
console.log(await foo());
}

run();

//

请记住,使用 Promise 的目的是将您从使用回调中解放出来。因此无需向 foo 传递回调。

您可以使用 .thenawait 来检索 Promise 的值。您只能在异步函数中使用await;所以你不能在全局分数中使用 await ,你必须定义一个函数并调用它。因此,就您而言,使用 .then 更容易。

关于javascript - 如何从 promise 中获取值(value)。回调返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403665/

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