函数then()在JavaScript中是什么意思?

函数then()在JavaScript中是什么意思?,javascript,Javascript,我看到的代码如下所示: myObj.doSome("task").then(function(env) { // logic }); then()从哪里来?我怀疑doSome会返回这个,它是myObj,它也有一个then方法。标准方法链接 如果doSome没有返回这个,作为执行doSome的对象,请放心,它正在使用then方法返回某个对象 正如@patrick所指出的,就我所知,标准js没有then(),javascript中没有内置的then()方法(在撰写本文时) 似乎无论doSo

我看到的代码如下所示:

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

then()
从哪里来?

我怀疑doSome会返回这个,它是myObj,它也有一个then方法。标准方法链接

如果doSome没有返回这个,作为执行doSome的对象,请放心,它正在使用then方法返回某个对象


正如@patrick所指出的,就我所知,标准js没有then(),
javascript
中没有内置的
then()
方法(在撰写本文时)

似乎无论
doSome(“任务”)
返回什么,都有一个名为
then
的方法

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

console.log( myObj.doSome("task") ); // Expand the returned object in the
                                     //   console to see its properties.
更新(从ECMAScript 6开始):-

纯javascript中包含了
.then()
函数

从Mozilla文档中

then()方法返回一个承诺。它有两个参数:回调 功能为成功和失败案例的承诺

承诺对象反过来定义为

Promise对象用于延迟和异步 计算。承诺表示尚未完成的操作 然而,这在未来是可以预期的

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

在本例中
then()
doSome()
方法返回的对象的类方法。

the.then()函数用于Windows 8应用商店应用程序异步编程中的承诺对象。 据我所知,它的工作方式类似于回调

请在此文档中查找详细信息

当然,它也可以是任何其他已定义函数的名称。

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

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

有关更多信息,请参阅:


对于角度承诺:

在JavaScript中处理异步调用的传统方法是回调。 假设我们不得不一个接一个地给服务器打三个电话来设置我们的 应用对于回调,代码可能如下所示(假设 用于进行服务器调用的xhrGET函数):

在本例中,我们首先获取服务器配置。然后基于此,我们获取 有关当前用户的信息,然后最终获取当前用户的项目列表 用户。每个xhrGET调用都会接受一个回调函数,该函数在服务器运行时执行 他回答道

当然,嵌套级别越高,代码的读取、调试就越困难, 维护、升级并基本上使用。这通常被称为回调地狱。 此外,如果我们需要处理错误,我们可能需要向每个错误传递另一个函数 xhrGET调用来告诉它在发生错误时需要做什么。如果我们只想要一个 常见错误处理程序,这是不可能的

Promise API旨在解决这个嵌套问题和 错误处理问题

Promise API提出了以下建议:

  • 每个异步任务将返回一个
    promise
    对象
  • 每个
    promise
    对象将有一个
    then
    函数,该函数可以接受两个参数,一个
    success
    处理程序和
    错误
    处理程序
  • then
    函数中的成功或错误处理程序在 异步任务完成
  • then
    函数还将返回一个
    promise
    ,以允许链接多个调用
  • 每个处理程序(成功或错误)都可以返回一个
    ,该值将传递给下一个处理程序 在
    承诺链中充当
    参数
  • 如果处理程序返回一个
    承诺(发出另一个异步请求),那么下一个
    处理程序(成功或错误)将仅在该请求完成后调用
  • 因此,前面的示例代码可能会转换为如下内容,使用 承诺和
    $http
    服务(AngularJs):

    传播成功和错误

    链接承诺是一种非常强大的技术,它使我们能够完成很多工作 功能,比如让服务进行服务器调用,对 数据,然后将处理后的数据返回控制器。但是当我们与
    承诺
    锁链,有几件事我们需要记住

    考虑以下假设的
    promise
    链,其中包含三个承诺:P1、P2和P3。 每个
    promise
    都有一个成功处理程序和一个错误处理程序,因此S1和E1分别用于P1、S2和S2 P2为E2,P3为S3和E3:

    xhrCall()
      .then(S1, E1) //P1
      .then(S2, E2) //P2
      .then(S3, E3) //P3
    
    在正常的流程中,如果没有错误,应用程序将继续运行 通过S1、S2,最后是S3。但在现实生活中,事情从来没有那么顺利。P1可能 遇到错误,或者P2可能会遇到错误,从而触发E1或E2

    考虑以下情况:

    •我们在P1中收到来自服务器的成功响应,但返回的数据不正确 正确,或者服务器上没有可用数据(请考虑空阵列)。以这样的方式 在这种情况下,对于下一个承诺P2,它应该触发错误处理程序E2

    •我们收到承诺P2的错误,触发E2。但在处理器内部,我们有 缓存中的数据,确保应用程序可以按nor加载
    $http.get('/api/server-config').then(
        function(configResponse) {
            return $http.get('/api/' + configResponse.data.USER_END_POINT);
        }
    ).then(
        function(userResponse) {
            return $http.get('/api/' + userResponse.data.id + '/items');
        }
    ).then(
        function(itemResponse) {
            // Display items here
        }, 
        function(error) {
            // Common error handling
        }
    );
    
    xhrCall()
      .then(S1, E1) //P1
      .then(S2, E2) //P2
      .then(S3, E3) //P3
    
    promise.then(function(env) {
        // logic
    }); 
    
    navigator
        .getBattery()
        .then(function(battery) {
           var charging = battery.charging;
           alert(charging);
        })
        .then(function(){alert("YeoMan : SINGH is King !!");});
    
    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}`)
    })