我正在使用编写promise代码。然后现在,我决定使用wait/async编写它。我在promise中调用了一个函数add_,然后在中调用了另一个函数。然后是该函数的一部分。这是我使用的代码。然后
function create_section(sections,course_ID,i) {
return new Promise(
(resolve) => {
var s_duration = 0;
var sname = sections[i].name;
var s_obj = {
//some object;
}
var section_id;
DB.section.create(s_obj,function (err, data_s)
{
if (err) return next(err);
section_id = data_s._id;
var lesson = sections[i].lessons;
add_lessons(lesson,section_id,i)
.then(function(arr){
resolve(arr);
})
});
}
);
};
这是使用wait/async的代码。
function create_section(sections,course_ID,i) {
return new Promise(
async function resolve() {
var s_duration = 0;
var sname = sections[i].name;
var s_obj = {
//some obj
}
var section_id;
DB.section.create(s_obj,function (err, data_s)
{
if (err) return next(err);
section_id = data_s._id;
var lesson = sections[i].lessons;
var arr = await add_lessons(lesson,section_id,i)
resolve(arr);
});
}
);
};
使用await/async的代码显示了一个错误,即add\u lessons是意外标识符。那么,告诉我如何在promise中定义异步函数?
你把async
放在一个错误的函数前面。这个函数应该是async
:
DB.section.create(s_obj,function (err, data_s)
这样地:
DB.section.create(s_obj, async function (err, data_s)
只能在具有async
关键字的函数中使用wait
,而不能在具有async
关键字的其他函数中的所有函数中使用。
但是,您应该传递给new Promise()
构造函数的是一个函数,它将解决方案
作为参数,而不是一个本身名为解决方案
的函数。而不是这样:
return new Promise(
async function resolve() {
您应该使用以下内容:
return new Promise(function (resolve, reject) {
然后,您可能还应该运行reject
,而不是next(error)
-因此,您不应该:
if (err) return next(err);
您可以尝试:
if (err) return reject(err);
如果您确实想要拒绝从create_section()
函数返回的promise。
您混合了异步控制流的三种方式:回调、promise和异步/等待。您需要完全理解所有这些,以便能够毫无问题地将它们组合起来。
我建议编写一个包装器,为所有接受回调的函数返回promise,如下所示:
const sectionCreate = (...args) => new Promise((resolve, reject) => {
DB.section.create(...args, (err, data) => {
if (err) {
return reject(err);
}
resolve data;
});
});
(或者您可以使用Bluebird的promisify)现在您可以轻松地在异步/等待流中使用它:
async function create_section(sections, course_ID, i) {
var s_duration = 0;
var sname = sections[i].name;
var s_obj = {
//some obj
}
var section_id;
var data = await sectionCreate(s_obj);
var section_id = data_s._id;
var lesson = sections[i].lessons;
var arr = await add_lessons(lesson, section_id, i);
return arr;
}
这假设add_lessons()
返回一个promise,该promise是隐含的,但您的代码可能不是这样。您可以在promise上使用wait
,以便在返回promise的函数调用前使用wait
。
请注意,每个async
函数都会返回一个promise,因此不需要显式执行。
我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。
我真的需要温习一下我的异步等待和promise。我想要一些建议。 我正在对firebase firestore进行异步函数调用。函数应根据单个输入参数返回字符串。 该功能适用于1-1用户聊天。该功能是创建聊天/查找现有聊天,并返回其ID。 现在,我得到的作为返回值的和不知道为什么。除了返回之外,该函数还能正常工作。 我有两个功能。一个是React类组件生命周期方法,另一个是我的firebase异步
问题内容: 我不确定node.js如何在异步中实现哪些功能,在异步中没有实现的功能以及如何创建自定义异步功能。 说我想创建一个自定义的异步函数。如果只是因为我对异步函数回调或cb调用了我的最后一个参数而只知道其异步函数,我会感到惊讶: 我尝试了类似的方法,但它无法异步运行。您如何告诉node.js f实际上是异步的? 问题答案: 注意 :此答案写于2014年,在出现之前,在Promises流行之前
我看了类似的问题,没有找到一个解决方案,我可以实现到我自己的代码,因此我做了这篇文章。我有以下代码: 最后一个console.log返回undefined,尽管pool.query中的console日志提供了我要查找的正确字符串。我尝试过的这段代码的另一个版本给出了暂挂的promise,而不是未定义的promise。 通过阅读其他文章,我理解这是因为我没有将wait与async函数一起使用。问题是
我试图理解promise、回调等在node.js中是如何工作的,特别是在访问函数之外的值的情况下。我花了一些时间在这里浏览答案如何从异步调用返回响应?在这里调用条纹API等待,但我尝试的每一个变化,我总是以'订阅'函数之外未定义结束。 谢啦
我有一个异步块: 我可以跟踪成功和失败的结果。但是,是否可以重试整个chain?然后继续重试,直到问题解决?