Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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_Async Await - Fatal编程技术网

Javascript 有条件返回承诺或回调的包装函数

Javascript 有条件返回承诺或回调的包装函数,javascript,async-await,Javascript,Async Await,我的任务是在那里创建returner函数,如果没有回调,它将返回一个承诺,如果回调确实存在,则调用它 若returner只返回其第一个参数,那个么它将根据需要返回一个承诺 async function wait(callback){ var awaited = await giveError(); return returner(awaited, callback) } function giveError(){throw new Error('oops')} 问题是,如果有一个假

我的任务是在那里创建returner函数,如果没有回调,它将返回一个承诺,如果回调确实存在,则调用它

若returner只返回其第一个参数,那个么它将根据需要返回一个承诺

async function wait(callback){
  var awaited = await giveError();
  return returner(awaited, callback)
}


function giveError(){throw new Error('oops')}
问题是,如果有一个假设等待就是承诺的回调,我很难捕捉到错误

async function returner(awaited, callback){
  console.log('triggering returner')
  if(!callback){
    return awaited
  } else {
    console.log('there is a callback')
  }
}

wait().then(console.log).catch(err=>{
  console.log('correct error catching here for async \n\n')
})

// prints 'correct error catching here for async'
我有问题:

为什么“触发返回者”从不打印

等待的是承诺吗?如果没有,是否可以编写returner函数?

异步函数将始终返回承诺。如果要根据参数将函数的返回类型配置为不同,则需要手动执行以下操作:

函数foocb{ 如果cb的类型!==函数{ 返回Promise.hello; }否则{ 返回cbhello; } } foov=>console.logv; foo.thenv=>console.logv; 为什么“触发返回者”从不打印

因为等待会表现得像扔掉等待拒绝的承诺。因此,代码在那里终止,错误冒出来,返回者。。永远也达不到

等待的是承诺吗

不,这是承诺的确定价值

实际上,我会编写一个函数来包装异步函数本身并接受回调:

wait(function(err, val){
  console.log('callback error handling', err, val)
})

async function returner(awaited, callback){
  console.log('triggering returner')
  if(!callback){
    return awaited
  } else {
    awaited
    .then(val=>{
      callback(null, val)
    })
    .catch(err=>{
      callback(err)
    })
  }
}

// gives UnhandledPromiseRejectionWarning: Error: oops
这样,您可以将其写成:

  const withCallback = fn => (...args) => {
    const last = args[args.length - 1];
    if(typeof last === "function") {
      return fn(...args.slice(0, -1))
         .then(res => last(null, res))
         .catch(last);
   } else {
      return fn(.. args);
   }
 };
这允许您执行以下操作:

 const wait = withCallback(async function wait(){
   var awaited = await giveError();
   return "result";
 });
async将始终返回承诺。您不能在返回程序中执行此操作。在那个阶段已经太迟了,因为由于异步,wait总是会返回一个承诺。你必须等一等
 wait().then(/*...*/).catch(/*...*/)
 // As well as
 wait(function(error, result) { /*...*/ });