Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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,一个带有回调处理程序的对象,如何将其重写为wait/async样式?_Javascript_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript,一个带有回调处理程序的对象,如何将其重写为wait/async样式?

Javascript,一个带有回调处理程序的对象,如何将其重写为wait/async样式?,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我使用了一个api,它的对象提供回调处理程序,一个搜索函数 function searchAndDoSomething(name){ let searchObj = new APIobj(para1,{onSearchComplete:searchCompleteHandler}); searchObj.search(name); } function searchCompleteHandler(result){ doSomething(result); } Async

我使用了一个api,它的对象提供回调处理程序,一个搜索函数

function searchAndDoSomething(name){
    let searchObj = new APIobj(para1,{onSearchComplete:searchCompleteHandler});
    searchObj.search(name);
}
function searchCompleteHandler(result){
    doSomething(result);
}
Async Main(){
      result = await searchAndDoSomething(name);
      searchCompleteHandler(result);  
}
async Main() { // Note it's `async`, not `Async`
    const result = await searchAndDoSomething(name); // note declaration
    searchCompleteHandler(result);  
}
我的目标是这样做:

function searchAndDoSomething(name){
    let searchObj = new APIobj(para1,{onSearchComplete:searchCompleteHandler});
    searchObj.search(name);
}
function searchCompleteHandler(result){
    doSomething(result);
}
Async Main(){
      result = await searchAndDoSomething(name);
      searchCompleteHandler(result);  
}
async Main() { // Note it's `async`, not `Async`
    const result = await searchAndDoSomething(name); // note declaration
    searchCompleteHandler(result);  
}
但是如何重写searchAndDoSomething呢

async searchAndDoSomething(name){
     return new Promise(function(resolve){
         let searchObj = new APIobj(para1,{onSearchComplete:resolve};//this will call a resolve function.
     //and
     resolve(name);//instead of searchObj.search will no effect too.
    })
}

您的尝试已接近尾声,但由于您需要显式地创建承诺(因为
APIobj
没有),因此您的函数没有理由是
async
。此外,您只需调用
resolve
一次:

searchAndDoSomething(name) {
    return new Promise((resolve) => {
        const searchObj = new APIobj(para1, {onSearchComplete: resolve});
        searchObj.search(name);
    });
}
大概有一种方法可以让APIobj发出故障信号;如果是这样,您需要调用
拒绝
。例如,如果我猜测一个名为
onSearchError
的回调:

searchAndDoSomething(name) {
    return new Promise((resolve, reject) => {
        const searchObj = new APIobj(para1, {
            onSearchComplete: resolve,
            onSearchError: reject
        });
        searchObj.search(name);
    });
}
然后,您可以这样使用:

function searchAndDoSomething(name){
    let searchObj = new APIobj(para1,{onSearchComplete:searchCompleteHandler});
    searchObj.search(name);
}
function searchCompleteHandler(result){
    doSomething(result);
}
Async Main(){
      result = await searchAndDoSomething(name);
      searchCompleteHandler(result);  
}
async Main() { // Note it's `async`, not `Async`
    const result = await searchAndDoSomething(name); // note declaration
    searchCompleteHandler(result);  
}


APIobj
是否无法发出失败的信号?我查阅了说明,似乎搜索结果对象没有我认为您的评论在那里被截断了…我查阅了说明,似乎搜索“结果”对象没有失败的类型,也许我不知道失败的位置。所以我屏蔽了我的WiFi,看到控制台弹出一个GET错误。以0()结尾。感谢@Bergi,一如既往的敏锐目光!