javascript - 如何将 promise resolve() 转移到另一个 promise

标签 javascript promise q

假设我有一个“JsonEditor”模块(仅作为示例),它具有 3 个函数:get()、setProperty() 和 save()。

代码如下(问题如下):

var fs   = require('fs')
  , q    = require('q');

var jsonEditorModule = (function() {
    return {
        get: function(jsonPath) {
            // ...
        },

        save: function(jsonObject, jsonPath) {
            var qJson = q.defer();

            var jsonContent = JSON.stringify(jsonObject, null, 2);

            fs.writeFile(jsonPath, jsonContent, function(err) {
                if(err) {
                    qJson.reject(err);
                }
                else {
                    qJson.resolve();
                }
            });

            return qJson.promise;
        },

        setProperty: function(prop, value, jsonPath) {
            var self = this;
            var qJson = q.defer();

            this.get(jsonPath)
            .then(
                function(jsonObject) {
                    // Set the property
                    jsonObject[prop] = value;

                    // Save the file
                    self.save(jsonObject, jsonPath)
                    .then(
                        function() {
                            qJson.resolve();
                        },
                        function() {
                            qJson.reject();
                        },
                    );
                }
            );

            return qJson.promise;
        },
    };
})();

module.exports = jsonEditorModule;

看到 setProperty() 函数中 save() 之后的 then() 了吗?

这看起来很愚蠢,对吧?

我是否需要手动 resolve() 和 reject() 我的 promise ? 我不能将 save() 行为转移到我的 setProperty() promise 中吗?

希望问题足够清楚(不要太愚蠢)。

谢谢

最佳答案

此处描述了您想要实现的目标:chaining ,基本上,如果处理程序返回一个 promise (让我们称之为 innerPromiseFromHandler),那么 .then 的处理程序将在 时执行innerPromiseFromHandler 获取一个解析值:

var jsonEditorModule = (function() {
  return {
    get: function(jsonPath) {
      return Q.delay(1000).then(function () {
        document.write('get...<br/>');
        return 'get';
      });
    },

    save: function(result) {
      return Q.delay(1000).then(function () {
        document.write('save...<br/>');        
        return result + ' save';
      });
    },

    setProperty: function(prop, value, jsonPath) {
      return this.get(jsonPath)
        .then(function(result) {
          return jsonEditorModule.save(result);
        });
    }
  };
})();
      
jsonEditorModule
  .setProperty()
  .then(function (result) {    
    document.write(result + ' finish');
  })
<script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.2/q.js"></script>

关于javascript - 如何将 promise resolve() 转移到另一个 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881265/

相关文章:

javascript - 对使用 angular 和 typescript 链接 $q promises 感到困惑

javascript - 通知 Promise Angular 删除回调

javascript - 在我的特定 PHP 代码中处理 slider 标签

javascript - 特殊字符验证未按预期工作

javascript - JS、 Angular 、AJAX : how to mix those three?

javascript - NodeJs 错误处理 try catch block 中的 promise 错误

javascript - 从 Bluebird Promise 对象访问 jQuery $.get URL

java - IBM Filenet Content Navigator 自定义插件 - 编辑属性后 GridX 行变为空白

javascript - Javascript Promises库可在浏览器中创建“长时间运行代码-非阻塞UI”?

javascript - 既然我们有 ES6 promise ,还有理由使用 Q 或 BlueBird 之类的 promise 库吗?