我看到的代码是这样的:

myObj.doSome("task").then(function(env) {
    // logic
});

那么()从何而来?


当前回答

在这种情况下,then()是doSome()方法返回的对象的类方法。

其他回答

这是一个小的JS_Fiddle。

然后是一个方法回调堆栈,在承诺被解决后可用,它是库的一部分,如jQuery,但现在在原生JavaScript中可用,下面是它如何工作的详细解释

你可以在原生JavaScript中做一个承诺:就像在jQuery中有承诺一样,每个承诺都可以堆叠,然后可以用Resolve和Reject回调调用,这就是你如何链式异步调用。

我从MSDN文档中分叉和编辑电池充电状态。

这是试图找出用户的笔记本电脑或设备是否正在充电电池。然后是叫你和你的工作成功后。

navigator
    .getBattery()
    .then(function(battery) {
       var charging = battery.charging;
       alert(charging);
    })
    .then(function(){alert("YeoMan : SINGH is King !!");});

另一个es6例子

function fetchAsync (url, timeout, onData, onError) {
    …
}
let fetchPromised = (url, timeout) => {
    return new Promise((resolve, reject) => {
        fetchAsync(url, timeout, resolve, reject)
    })
}
Promise.all([
    fetchPromised("http://backend/foo.txt", 500),
    fetchPromised("http://backend/bar.txt", 500),
    fetchPromised("http://backend/baz.txt", 500)
]).then((data) => {
    let [ foo, bar, baz ] = data
    console.log(`success: foo=${foo} bar=${bar} baz=${baz}`)
}, (err) => {
    console.log(`error: ${err}`)
})

then是一个用于解决异步回调的方法 这是在ES6中引入的 请在这里找到适当的文件Es6承诺

在这种情况下,then()是doSome()方法返回的对象的类方法。

截至ECMAScript6

.then()方法已经包含在纯JavaScript的Promises中。

来自Mozilla文档:

then()方法返回一个Promise。它有两个参数:callback 有关承诺成功及失败个案的功能。

Promise对象定义为

Promise对象用于延迟和异步 计算。Promise表示未完成的操作 然而,但在未来是值得期待的。

也就是说,Promise充当一个尚未计算,但将来将被解析的值的占位符。然后,.then()函数用于在Promise被解析时关联将要在Promise上调用的函数——无论是解析成功还是解析失败。

ECMAScript6之前

据我所知,在javascript中还没有内置的then()方法(在撰写本文时)。

无论doSome(“task”)返回的是什么,似乎都有一个调用then的方法。

如果您将doSome()的返回结果记录到控制台,您应该能够看到返回结果的属性。

console.log( myObj.doSome("task") ); // Expand the returned object in the
                                     //   console to see its properties.

then()函数与一些库或框架(如jQuery或AngularJS)中使用的“Javascript承诺”相关。

promise是一种处理异步操作的模式。该承诺允许您调用一个名为“then”的方法,该方法允许您指定作为回调函数使用的函数。

欲了解更多信息,请参阅:http://wildermuth.com/2013/8/3/JavaScript_Promises

对于Angular的承诺:http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/

这是我为自己做的一个东西,用来弄清楚事情是如何运作的。我想其他人也会发现这个具体的例子很有用:

doit().then(function() { log('Now finally done!') }); log('---- But notice where this ends up!'); // For pedagogical reasons I originally wrote the following doit()-function so that // it was clear that it is a promise. That way wasn't really a normal way to do // it though, and therefore Slikts edited my answer. I therefore now want to remind // you here that the return value of the following function is a promise, because // it is an async function (every async function returns a promise). async function doit() { log('Calling someTimeConsumingThing'); await someTimeConsumingThing(); log('Ready with someTimeConsumingThing'); } function someTimeConsumingThing() { return new Promise(function(resolve,reject) { setTimeout(resolve, 2000); }) } function log(txt) { document.getElementById('msg').innerHTML += txt + '<br>' } <div id='msg'></div>