Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点异步库:使用回调转换承诺结构_Javascript_Node.js_Asynchronous - Fatal编程技术网

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
一开始就不是一个选项