2016-11-09 21 views
7

我开始使用ES7功能async/await,这给处理异步任务的最佳方法,使你的代码更加清晰易读。是否有可能解决异步函数没有return关键字

但是,它不会让您访问由异步函数创建的Promise,因此如果您在异步函数中执行了一些异步请求,您应该对它进行promisify,然后等待它,然后返回结果。我的意思是这样的:

async function doStuff() { 
    //stuff... 
    var value = await new Promise(function(resolve) { 
     $.get('http://some/url/...', function(result) { 
      // stuff... 
      resolve(result); 
     }); 
    }); 
    return value; 
} 

如果你能找到什么指针由函数创建的承诺让你的代码可能是这样的:

async function doStuff() { 
    //stuff... 
    var p = arguments.callee.promise; 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     p.resolve(result); 
    }); 
} 

甚至:

async function doStuff() { 
    //stuff... 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     async.resolve(result); 
    }); 
} 

这样你不需要直接访问Promises API,这使得你的代码完全专注于任务,而没有任何其他。

+1

我在想你错过了'async' /'await'这一点。你可以产生一个场景,只需要执行'result = await $ .get(someUrl); doStuffWith(结果)'是不够的?该提案的重点不在于处理回调。 – Amadan

+0

我只是想,如果你是在已经承诺为什么你需要创建另一个。 Bergi下面的回答很清楚 - 号码=) – rokstar

回答

11

是否有可能解决异步函数没有return关键字

没有办法去呼叫到async function创建的承诺的引用,但确实存在是没有必要访问,要么(顺便说一句,你不能.resolve()承诺,你实际上需要访问承诺的解决功能)。

async/await整点要与诺言和其他可敬的东西玩得很好。这个想法是,异步函数返回一个承诺,并且你不必promisify任何东西(但如果你真的必须,单独做) - 事实上,$.get确实返回一个(jQuery)的承诺。所以,简单地写

async function doStuff() { 
    //stuff... 
    var result = await $.get('http://some/url/...'); 
    // stuff... 
    return value; 
} 

如果你真的有一个回调回吐功能,用一个简单的

async function doStuff() { 
    // stuff… 
    return new Promise(function(resolve, reject) { 
     $.get({ 
      url: 'http://some/url/...', 
      success: resolve, 
      error: reject 
      // don't do other "stuff" in here 
     }); 
    }); 
} 
0

当你从返回功能的承诺是没有必要的功能是异步,实际上它甚至是糟糕的,因为你正在创造两个承诺!

function doStuff() { 
    return new Promise(function(resolve, reject) { 
     $.get('http://some/url/...', result => resolve(result)); 
    }); 
} 

async function main() { 
    const result = await doStuff(); 
} 
相关问题