簡體   English   中英

Promise resolve() 沒有被調用

[英]Promise resolve() doesn't get called

注意:這個 javascript 使用 openui5 庫

attachOnceAsync: function(binding, callback) {
  var args = [...arguments]
  args.splice(0, 2)

  return new Promise((resolve, reject) => {
    var dataReceived = function(oEvent) {
      if (typeof callback == 'function') {
        if (callback.constructor.name === "AsyncFunction") {
          callback(oEvent, ...args).then(() =>
            resolve(oEvent)
          ).catch((err) => {
            reject(err)
          })
        } else {
          try {
            callback(oEvent, ...args);
            resolve(oEvent)
          } catch (err) {
            reject(err)
          }
        }
      } else {
        resolve(oEvent, ...args);
      }
    }
    binding.attachEventOnce("dataReceived", dataReceived);
  })
}

沒有像“dataReceived”這樣的事件的任何 Promise 版本,所以這是我總結的嘗試。

在這種情況下,回調是未定義的(它不應該是,但這是一個不同的問題)。 行 resolve(oEvent, ...args); 相反被擊中,只是它永遠不會從等待中返回!

我將該行更改為僅解決(oEvent),但仍然沒有樂趣。

任何想法我做錯了什么? 謝謝

PS:我會密切關注這個問題,所以我可以提供任何需要的額外信息

我是這樣稱呼它的:

handleAsync: async function(controller) {
  
  /* Lots of setup */

  var response = await fetch(/*redacted*/ )

  if (response.status === 400) {
    console.log(await response.json());
    throw new BadRequestException();
  }

  if (response.status === 204){
   
    /* more setup */

    context = oPanel.getBindingContext("odata");

    var updatePurchaseOrderDocTotalFunc = this.updatePurchaseOrderDocTotal
    var callback = async function() {
      
      var docTotalUpdate = await updatePurchaseOrderDocTotalFunc(oView, context, oModel, agreedPrice);
    
      if (docTotalUpdate && docTotalUpdate.status === 204) {
        await context.refresh();
      }
    }

    //-- HERE --
    await AsyncBinding.attachOnceAsync(binding,callback)
    
    await context.refresh();
  }       
  return true;   
}

好的 - 答案正盯着我看。

抱歉,我無法提供工作片段,但 ui5 腳本非常廣泛。

我還有其他幾個返回 Promise 的函數,所以我可以使用 await/async 方法,但是使用這個我忘了包含導致事件觸發的操作。

我重命名了 function 以顯示它現在的作用,並包括導致事件觸發的操作:

RefreshAsync :  function(context,binding, callback){
  var args = [...arguments]
  args.splice(0,2)

  return new Promise((resolve,reject)=>{
    var dataReceived = function(oEvent){  
        if(typeof callback == 'function' ){
            if(callback.constructor.name==="AsyncFunction"){
                callback(oEvent, ...args).then(()=>{                          
                    resolve(oEvent)
                }).catch((err)=>{                          
                    reject(err)
                })
            }else{
                try{
                    callback(oEvent, ...args);                         
                    resolve(oEvent)
                }catch(err){                          
                    reject(err)
                }
            }
        }else{                         
            resolve([oEvent, ..args])
        }
    }
    binding.attachEventOnce("dataReceived", dataReceived);
    
    //This is the action I missed
    context.Refresh()
  })
},

暫無
暫無

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

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