【问题标题】:Can you add a .then to a promise after it's created?你可以在创建后将 .then 添加到 Promise 中吗?
【发布时间】:2019-09-28 21:01:47
【问题描述】:

承诺让我感到困惑。

我正在尝试制作一个模拟数据服务来模仿 axios。

我的模拟 put 调用将 targetUrl 传递给 _fetch,然后查看它是否是有效的 url 并返回一个带有延迟 .resolve 的新 Promise

const _returnResponse = (mockData, time = 0) => new Promise((resolve) => {
    setTimeout(() => {
        resolve(mockData);
    }, time);
});

或带有延迟 .reject 的新 Promise

const _returnError = (time = simulatedDelay) => {
    const returnValue = new Promise(((resolve, reject) => {
        setTimeout(() => {
            reject(new Error('error'));
        }, time);
    }));
    return returnValue;
};

但是当我进行模拟 put 调用时,它会返回一个模拟数据,调用方法将其解释为成功,并且控制台会在其 .then 中登录

    put(target, putBody) {
        const returnValue = _fetch(target, simulatedDelay)
        returnValue.then(response => _console('PUT', target, response, putBody));
        return returnValue;
    },

但是使用无效的目标控制台会记录未捕获的错误

或者这会正确处理错误,但控制台会记录未定义的响应

    put(target, putBody) {
        const returnValue = _fetch(target, simulatedDelay).then(response => _console('PUT', target, response, putBody));
        return returnValue;
    },

调用方法如下:

    saveStuff({ commit, state }, newStuff) {
        //other code

        return this.$mockAxios.put(url, putBody)
            .then((response) => {
                return response;
            });
    },

我觉得我完全错过了一些东西,我已经研究了几个小时,但我仍然没有得到它。

【问题讨论】:

  • 在理解您要对代码执行的操作时遇到一些困难。可能值得将隔离代码放入 JSFiddle 或类似的代码游乐场服务中。否则,如果您可以访问 ES7/babel,则最好使用带有 asyncawait 关键字的异步函数,这使得异步编程更加容易和简单。
  • 我不确定如何处理您的确切问题 - 但关于您的评论“Promises just baffle me”,我发现本教程很有帮助:medium.com/@rafaelvidaurre/…
  • 这很有帮助。我可能会在某个时候用小提琴来更新我的具体问题,但我真正需要的是为我指明更多学习的方向。谢谢

标签: javascript es6-promise


【解决方案1】:

作为对问题的直接回答:是的,您可以在创建承诺后将 .then() 添加到承诺中。

例子:

const hi = new Promise((resolve, reject) => {
  setTimeout(() => resolve('hello'), 2000);
});

hi.then(result => console.log(result));

至于让您感到困惑的承诺,我建议(除了更多阅读之外)在您的 IDE 中使用 setTimeout 进行大量操作。我知道你已经在你的模拟中使用了 setTimeout,但进一步剥离它并在它自己的文件中运行代码,这样你就可以控制整个环境。有很多 console.log('blah') 来查看订单等。还要确保你对回调同样熟悉,因为 Promise 只是回调的语法糖。尝试同时阅读 JS 事件循环 - 如果您知道回调/承诺如何以及何时执行,它可能会提供一些上下文。

请注意,您甚至可以在回调解决或拒绝后添加 .then()。因此,术语“承诺” - 它实际上是您的 .then() 函数将运行的承诺。 https://en.wikipedia.org/wiki/Promise_theory

const hi = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('one second');
    resolve();
  }, 1000);
});

setTimeout(() => {
  hi.then(() => console.log('two seconds. this executes approximately a full second after the first promise has resolved'));
}, 2000);

【讨论】:

  • 非常感谢詹姆斯。我会花一些时间研究这些主题,然后按照您的建议进行简化。我遇到的问题是在线资源用完了,但仍然无法理解。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2021-04-22
  • 2015-12-06
  • 2021-04-29
  • 2011-04-04
相关资源
最近更新 更多