![](/img/trans.png)
[英]Async function doesn't return, despite promise resolve() being called
[英]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.