2016-07-28 55 views
1

为什么打印结果不断返回“asd”?使用带飞镖的期货

 var jerl = "asd"; 

    HttpRequest.request('Foo', 
    method: "GET", 
    requestHeaders: {"Authorization": "Secret"}).then((x) => x.responseText).then((y) => jerl = y); 

    print(jerl); 
+0

这看起来不像angularjs代码.... – Claies

+0

必须已经下意识地添加它 – BluishMicrobe

回答

6

异步代码只是安排在以后执行,同步代码继续执行而不等待异步代码。当计划的异步代码完成时,您传递给Future.then(...)的方法会执行。在StackOverflow上,您可以找到很多这样的问题和示例,标记为[:dart-async:]。

如果您希望在异步代码完成,你需要IT连锁与then就像你与其他代码做

var jerl = "asd"; 

HttpRequest.request('Foo', 
    method: "GET", 
    /* return */ requestHeaders: {"Authorization": "Secret"}) 
    .then((response) { 
    var jer1 = x.responseText; 
    print(jerl); 
    }); 

您可以使用async/await功能,使代码看起来更像是要执行的代码同步码

Future someMethod() async { // <== added `Future` and `async` 
    var jerl = "asd"; 

    var response = await HttpRequest.request('Foo', // <== added `await` 
    method: "GET", 
    requestHeaders: {"Authorization": "Secret"}).then((x) => 
    print(response.text); 
} 

async具有传染性。无法从异步执行返回到同步执行。如果您的代码调用任何异步方法或函数,并且您需要进一步下载代码以等待异步结果,那么您需要使用.then(或使用async/await)链接以下所有代码(在调用方法中也是如此)。为此,您还需要return来电者的未来,以便他可以拨打.then()

With async/await您不需要明确地返回未来。

async/await不会使异步码同步(如上所述),它仅使得它看起来更像同步码。基本行为与then相同。

+0

真的很好的破败!谢谢! – BluishMicrobe