你不明白的是javascript编译器是如何处理promise的。
这就是编译器如何看待你的代码;
var textFromElement = someElement.getText().then(function(text){return text})
var splittedText = textFromElement.split(" ")
1 - 所有变量都是在函数范围的顶部创建的,无论你在哪里分配它。
var textFromElement; (= undefined)
var splittedText; (= undefined)
2 - 为每一行做最少的工作并移动到下一行。
testFromElement = {promise element object};
splittedText = {promise element object}.split(" "); (= undefined)//This what you don't want.
3 - 从顶部开始,在未解决的行上做更多的最小工作。
testFromElement = {promise getText object};
4 - 从顶部开始,在未解决的行上做更多的最小工作。
testFromElement = "text text";
简而言之,它会先分配 splittedText 三个步骤。
好例子:
var splittedText;
it("should get split text", function(done) {
someElement.getText().then(function(textFromElement){
splittedText = textFromElement.split(" ");
done();
})
})
1 - 所有变量都是在函数范围的顶部创建的,无论你在哪里分配它。
var splittedText; (= undefined)
2 - 在调用 done() 之前,只有在这个函数内部完成工作
it("should get split text", function(done) {
3 - 为每一行做最少的工作并移到下一行。
someElement = {promise element object};
4 - 从函数的顶部开始,对未解决的行做更少的工作。
someElement.getText() = {promise getText object};
5 - 从函数的顶部开始,对未解决的行做更少的工作。
textFromElement = "text text";
splittedText = textFromElement.split(" "); (["text","text"]);
done(); //the compiler can now to work outside this function