簡體   English   中英

包裝函數,有條件地返回promise或callback

[英]Wrapper function that conditionally returning promise or callback

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


function giveError(){throw new Error('oops')}

我的任務是在那里創建returner函數,如果沒有回調,它將返回一個promise,如果確實存在,則調用該回調

如果returner除了返回第一個參數外什么也不做,它將返回一個promise

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'

問題是,如果有回調,我很難捕捉到該錯誤(假設awaited是一個承諾)

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

我有問題:

為什么“觸發返回者”從不打印?

awaited諾言? 如果不是,是否有可能編寫returner函數?

為什么“觸發返回者”從不打印?

因為如果等待正在等待的諾言, await將表現為throw 因此,代碼在此處終止,並且錯誤冒出氣泡,永遠不會到達return returner(..)

等待諾言?

沒有承諾的解決價值。


我實際上會寫一個包裝異步函數本身並接受回調的函數:

  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";
 });

這使您可以執行以下操作:

 wait().then(/*...*/).catch(/*...*/)
 // As well as
 wait(function(error, result) { /*...*/ });

async函數將始終返回Promise 如果要將函數的返回類型配置為根據參數而有所不同,則需要手動進行操作:

 function foo(cb) { if (typeof cb !== "function") { return Promise.resolve("hello"); } else { return cb("hello"); } } foo(v => console.log(v)); foo().then(v => console.log(v)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM