在Angular 2中,与$q.when相当的方法是什么?

6

我习惯于在Angular 1中使用$q。现在我要迁移到Angular 2。

是否有一个等效的方法提供.when()

例如,我需要将以下代码迁移:

.service('updateProDB', [
            '$rootScope',
            'connectionStatus',
            '$q',
            'storageService',
            'sendToServer',
            '$ionicPopup',
            function ($rootScope, connectionStatus, $q, storageService, sendToServer, $ionicPopup) {
                'use strict';

                var dbReadyDeferred = $q.defer(),
                prodata = [],
                prodataFieldNames = [];

            this.get = function () {
                var debugOptionUseLocalDB = 0,
                    prodata = [],
                    serverAttempts = 0;

                if (debugOptionUseLocalDB) {
                    return fallbackToLocalDBfileOrLocalStorageDB();
                }
                if (connectionStatus.f() === 'online') {
                    console.log("Fetching DB from the server:");
                    return getDBfileXHR(dbUrl(), serverAttempts)
                            .then(function () { // success
                                console.log('-normal XHR request succeeded.');
                                return dbReadyDeferred.promise;
                            })
                            .catch(function (){

1
在Angular 2中,您可以使用Observable.ofPromise - Pankaj Parkar
3
你所发布的代码中没有 .when() 方法。 - Adam
@PankajParkar 但这真的等价吗? .when() 没有将非 Promise 值包装成 Promise 并保留 Promise 不变吗?(所以 when(when(1)) 是一个返回 1 的 Promise)如果你执行 Observable.of(Observable.of(1)) 会发生什么?你会得到一串流 - 编辑:确认,它确实是这样,因此它们不是等价的。 - olivarra1
是的,你说得对@Adam...抱歉。我的意思是我需要在这段代码中替换使用$q,但是在我的应用程序的其他地方我使用了$q.when。 - Louis
1个回答

10

您可以使用以下代码实现同样的功能:

Promise.resolve(promise).then

基本上没有区分承诺和值。

是的,您可以以相同的方式实例化q,但使用new Promise()而不是$q()

let promise = new Promise((resolve, reject) => {
    if (/* some async task */) {
       resolve('Success!');
    } else {
        reject('Oops... something went wrong');
    }
});

需要翻译的内容:

and

let promise = $q((resolve, reject) => {
    if (/* some async task */) {
       resolve('Success!');
    } else {
       reject('Oops... something went wrong');
    }
});

它们应该是等价的


好的,怎么实例化它? var deferredVar = new Promise() - Louis
是的,您可以像实例化 $q 一样实例化 Promise。 - Ajk_P
1
所以你示例中的等效语句应该是 Promise.resolve(promise).then,对吗? - Louis
1
是的。实际上,$q 的文档显示.when.resolve的别名。所以 $q 也有一个执行相同操作的.resolve - Ajk_P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接