【问题标题】:equivalent of $q.when in angular 2相当于 $q.when 在角度 2
【发布时间】:2023-03-30 18:32:01
【问题描述】:

我习惯于将 $q 与 angular 1 一起使用。我正在迁移到 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 (){

【问题讨论】:

  • 您可以在角度 2 中使用 Observable.ofPromise
  • 您发布的代码没有.when() 方法。
  • @PankajParkar 但它真的等效吗? .when() 不是将非承诺值包装到承诺中并保持承诺不变吗? (所以when(when(1)) 是一个返回 1 的承诺)如果你执行Observable.of(Observable.of(1)) 会发生什么?你得到一个流 - 编辑:确认,确实如此,因此它们不相等。
  • 是的,你是对的@Adam ...对不起。我的意思是我需要替换此代码中的 use $q,但在我的应用程序的其他地方我使用 $q.when。

标签: angular ionic2 observable deferred


【解决方案1】:

你可以做同样的事情,用:

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');
    }
});

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

它们应该是等价的

【讨论】:

  • 好的,谢谢,如何实例化它? var deferredVar = new Promise()?
  • 是的,您实例化 Promise 的方式与实例化 $q 的方式相同
  • 所以在您的示例中相当于 when 将是 ̀Promise.resolve(promise).then ` 对吗?
  • 是的。事实上$q 的文档显示.when.resolve 的别名。所以$q 也有一个.resolve 做同样的事情。
猜你喜欢
  • 2016-01-15
  • 2023-02-10
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多