Javascript 节点异步库:使用回调转换承诺结构
我得到了以下代码块:Javascript 节点异步库:使用回调转换承诺结构,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我得到了以下代码块: new Promise((res, rej) => { if (checkCondition()) { res(getValue()) } else { getValueAsync((result) => { res(result) }) } }).then((value) => { doStuff(value) }) 我想使用这个库,这是代码库其余部分使用的。我试图找出哪个函数最能解决这个问题。我只能
new Promise((res, rej) => {
if (checkCondition()) {
res(getValue())
} else {
getValueAsync((result) => {
res(result)
})
}
}).then((value) => {
doStuff(value)
})
我想使用这个库,这是代码库其余部分使用的。我试图找出哪个函数最能解决这个问题。我只能想出一个解决方案,但似乎有点笨拙:
async.tryEach([
(cb) => {
if (checkCondition()) {
cb (null, getValue())
} else {
cb (1)
}
},
(cb) => {
if (!checkCondition()) {
getValueAsync((result) => {
cb(null, result)
})
} else {
cb (1)
}
}],
(err, value) => {
doStuff(value)
}
)
就像我说的,这感觉很笨重。它以异步方式运行检查,这很好,而且我很确定它将始终得到正确的结果,但是代码块现在要大得多,而且更容易混淆
我在这里的唯一目的是使用与代码库其余部分相同的库和技术,而代码库根本不使用承诺。我在任何地方都找不到类似的控制流块,这就是为什么我需要自己构建它。如果我无法兑现承诺,那就随它去吧,但我想利用这个库找到一个解决方案。我想你可能想得太多了 异步库用于Node.js样式的异步代码。Per: 所有这些函数都假定您遵循Node.js约定,即提供一个回调作为异步函数的最后一个参数(预期错误作为其第一个参数的回调),并调用回调一次 因此,promise代码的异步样式版本如下所示:
function myThing(cb) {
if (checkCondition()) {
cb(null, getValue());
} else {
getValueAsync(result => cb(null, result));
}
}
myThing((err, res) => doStuff(res));
您会注意到,这看起来非常像您最初的承诺代码
由于myThing
接受Node.js样式的回调函数作为其最后一个参数,因此您现在可以将其与异步库的任何函数一起使用,例如:
async.series(
[ myThing, myThing, myThing ],
(err, res) => doStuff(res)
);
您可以在下面的代码片段中看到一个工作示例
const条件=false;
const checkCondition=()=>条件;
常量getValue=()=>123;
const getValueAsync=cb=>setTimeout(()=>cb(getValue()),250);
const doStuff=value=>console.log('doStuff',value);
函数神话(cb){
if(checkCondition()){
cb(null,getValue());
}否则{
getValueAsync(结果=>cb(null,结果));
}
}
虚构((错误,重复)=>doStuff(重复));
异步系列(
[虚构,虚构,虚构],
(err,res)=>doStuff(res)
);代码>
我不熟悉该库,但我可以建议node 8 async/await吗?看起来它比你的代码示例要干净得多。。另外,我发现该服务正在运行node6,因此async
/await
一开始就不是一个选项