相关疑难解决方法(0)

单个angularjs promise上的多个`.then()` - 都使用_original_数据

我正在写一个依赖承诺的angularjs应用程序,虽然它正在工作,但我想知道我是否可以更优化地做到这一点.

在代码的开头,我正在创建一个获取一些数据的承诺.完成后,我想运行几个都使用这些数据的函数.这些函数附加在应用程序的不相关部分,因此我不知道它们附加到承诺的顺序.它们也不需要按顺序完成.

app.service("Fetch", function ($q){
    return function() {
        var def = $q.defer();
        somelibrary.asynccall(function(error, data){ //callback
            if (error) def.reject(error);
            else def.resolve(data);
        });
        return def.promise;
    };
});

app.controller("ctrl", function ($scope, Fetch) {
    var prom = Fetch();

    //somewhere:
    prom.then(function(data){$scope.var1 = data["VAR1"];});
    //somewhere else:
    prom.then(function(data){$scope.var2 = data["VAR2"]});
});
Run Code Online (Sandbox Code Playgroud)

这里的主要缺点是后者then只在前面的那些完成时执行,这在此不是必需的.

另外,我需要return data在每个内部添加function(data){...},否则以下then()没有data可用.

有没有其他方法可以做到这一点,更适合这种情况?


编辑:正如@jfriend00所提到的,我错了; 事实上,只要成功解决了承诺,这两个函数就会并行运行,并且它们不会被链接,因此不会相互依赖.谢谢你的帮助

javascript promise angularjs

47
推荐指数
1
解决办法
4万
查看次数

使用Promises纠正多路流的模式

所以我过去几天一直在玩承诺,只是试图转换一些项目,使用承诺,但我已经多次修复这个问题.

在阅读文章和教程时,一切看起来都很流畅:

getDataFromDB()
.then(makeCalculatons)
.then(getDataFromDB)
.then(serveToClient)
Run Code Online (Sandbox Code Playgroud)

但实际上,它不是那样的.
程序有很多"if conditions"改变整个流程:

getDataFromCache(data).then(function(result){
    if(result){
        return result;
    }else{
        return getDataFromDB();
    }
}).then(function(result){
    if(result){
        serveToClient() //this does not return a promise, so undefined returned...
    }else{
        return getDataFromWebService(); //this does return a promise, 
    }
}).then(function(result){
    //i dont want to reach here if i already serveToClient()...
    //so i basically have to check "if(result)" for all next thens
    if(result){
       //do more stuff
    }
}).then(...
Run Code Online (Sandbox Code Playgroud)

我有两个主要问题:

  1. 我发现自己ifthen回调中添加了很多条件.
  2. 我仍然进入下一个then回调,即使我已经完成了(serveToClient)


我是否遵循了正确的模式?

javascript promise es6-promise

6
推荐指数
1
解决办法
142
查看次数

理解javascript承诺; 堆叠和链接

我一直遇到javascript承诺的几个问题,特别是堆叠链.

谁能向我解释这些不同实现之间的差异(如果有的话)?

实施1

var serverSidePromiseChain;
serverSidePromiseChain = async().then(function(response) {
    console.log('1', response);
    return response;
}).then(function(response) {
    console.log('2', response);
    return true;
}).then(function(response) {
    console.log('3', response); // response expected to be 'true'
    return async3();
}).then(function(response) {
    console.log('4', response);
    return async4();
})
Run Code Online (Sandbox Code Playgroud)

实施2

var serverSidePromiseChain;
serverSidePromiseChain = async().then(function(response) {
    console.log('1', response);
    return response;
});

serverSidePromiseChain.then(function(response) {
    console.log('2', response);
    return true;
})
serverSidePromiseChain.then(function(response) {
    console.log('3', response); // response expected to be 'true'
    return async3();
})
serverSidePromiseChain.then(function(response) {
    console.log('4', response);
    return async4();
})
Run Code Online (Sandbox Code Playgroud)

实施3

var serverSidePromiseChain; …
Run Code Online (Sandbox Code Playgroud)

javascript promise chain

5
推荐指数
1
解决办法
7113
查看次数

同一个 Promise 实例是否可以有多个 thenable?

当我对单个 Promise 对象有多个 thenable 函数时,它会起作用吗?在这种情况下我不想嵌套。我想对同一个承诺对象执行不同的操作。

var a = 0,
t = null,
promiseFun = function () {
    return new Ext.Promise(function (resolve, reject) {
        t = setInterval(function () {
                if (a == 1) {
                    resolve();
                    clearInterval(t);
                } else if (a == 2) {
                    reject();
                    clearInterval(t);
                }
            }, 1000);
    })
};

var promiseObj = promiseFun();
//handler one
promiseObj.then(function () {
    console.log('resolved 1')
}, function () {
    console.log('rejected 1')
}).then(function () {
    console.log('resolved Nest')
}, function () {
    console.log('rejected Nest')
});

//handler two- …
Run Code Online (Sandbox Code Playgroud)

javascript extjs promise

4
推荐指数
1
解决办法
1871
查看次数

ES6承诺执行顺序

我希望以下代码段的输出是1, 2, 3, 4.但是,实际的输出顺序是1, 4, 3, 2.

self.promiseChain = new Promise(function (resolve, reject) {
  setTimeout(resolve, 4000);
}).then(function () {
  console.log(1);
});

self.promiseChain.then(function () {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, 3000);
  }).then(function () {
    console.log(2);
  });
});

self.promiseChain.then(function () {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, 2000);
  }).then(function () {
    console.log(3);
  });
});
self.promiseChain.then(function () {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, 200);
  }).then(function () {
    console.log(4);
  });
});
Run Code Online (Sandbox Code Playgroud)

http://www.es6fiddle.net/imu5bhoj/

我所读到的关于承诺的一切表明应该可以在这样的"扁平"链中获得所需的订单.显然我错过了一些细节?有人能指点我正确的方向吗?

这是一个小提琴(http://www.es6fiddle.net/imu6vh1o/ …

javascript ecmascript-6 es6-promise

3
推荐指数
1
解决办法
2053
查看次数