为什么打印结果会一直“asd”返回?
var jerl = "asd";
HttpRequest.request('Foo',
method: "GET",
requestHeaders: {"Authorization": "Secret"}).then((x) => x.responseText).then((y) => jerl = y);
print(jerl);
答案 0 :(得分:7)
异步代码只是安排在以后执行,同步代码继续执行而不等待异步代码。传递给Future.then(...)
的方法在计划的异步代码完成时执行。你发现很多这样的问题和例子在StackOverflow上标记为[:dart-async:]。
如果您希望在异步代码完成时执行代码,则需要将其与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()
。
使用async
/ await
,您无需明确返回未来。
async
/ await
不会使异步代码同步(如上所述),它只会使外观更像同步代码。基本行为与then
相同。