相关疑难解决方法(0)

打破承诺链并根据链中的步骤调用一个函数(它被拒绝)

更新:

为了帮助这篇文章的未来观众,我创建了这个pluma答案的演示.

题:

我的目标似乎相当简单.

  step(1)
  .then(function() {
    return step(2);
  }, function() {
    stepError(1);
    return $q.reject();
  })
  .then(function() {

  }, function() {
    stepError(2);
  });

  function step(n) {
    var deferred = $q.defer();
    //fail on step 1
    (n === 1) ? deferred.reject() : deferred.resolve();
    return deferred.promise;
  }
  function stepError(n) {
    console.log(n); 
  }
Run Code Online (Sandbox Code Playgroud)

这里的问题是,如果我在第1步失败,两个stepError(1)AND都会stepError(2)被解雇.如果我不return $q.reject那么stepError(2)就不会被解雇,但step(2)会,我明白了.除了我想做的事以外,我已经完成了所有的事情.

如何编写promises以便我可以在拒绝时调用函数,而无需调用错误链中的所有函数?或者还有另一种方法来实现这一目标吗?

这是一个现场演示,所以你有一些工作.

更新:

有点解决了.在这里,我在链的末尾捕获错误并传递数据,reject(data)以便我知道错误函数中要处理的问题.这实际上不符合我的要求,因为我不想依赖于数据.它会很蹩脚,但在我的情况下,将错误回调传递给函数会更加清晰,而不是依赖于返回的数据来确定要做什么.

现场演示(点击).

step(1)
  .then(function() {
    return step(2);
  })
  .then(function() …
Run Code Online (Sandbox Code Playgroud)

javascript promise angularjs

129
推荐指数
4
解决办法
13万
查看次数

如何使用Q正确中止node.js承诺链?

我正在使用Node.js 的Q模块试图在我有很多步骤的情况下避免"厄运金字塔".例如:

function doTask(task, callback)
{
    Q.ncall(task.step1, task)
    .then(function(result1){
        return Q.ncall(task.step2, task);
    })
    .then(function(result2){
        return Q.ncall(task.step3, task);
    })
    .fail(callback).end();
}
Run Code Online (Sandbox Code Playgroud)

基本上这似乎工作; 如果任何任务步骤引发错误,它将被传递给回调(尽管我欢迎改进,因为我是node.js promises的新手).但是,当我需要尽早中止任务链时,我遇到了问题.例如,如果result1成功返回,我可能想提前调用回调并中止其余的回调,但我尝试这样做的失败...

function doTask(task, callback)
{
    Q.ncall(task.step1, task)
    .then(function(result1){
        if(result1)
        {// the rest of the task chain is unnecessary 
            console.log('aborting!');
            callback(null, result1);
            return null;
        }
        return Q.ncall(task.step2, task);
    })
    .then(function(result2){
        console.log('doing step 3...');
        return Q.ncall(task.step3, task);
    })
    .fail(callback).end();
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我看到两个"中止!" 和"做第3步......"打印.

我相信我只是在这里误解了一些基本原则,所以我将不胜感激.谢谢!

node.js promise q

35
推荐指数
2
解决办法
3万
查看次数

在Q Promises中跳过then函数的正确方法

在我的代码中,基于特定条件,我想跳到done函数,而不管所有then函数.

该问题的原始版本在编辑中.以下是我正在处理的实际问题.抱歉给你带来不便

实际问题:

我正在读取文件并进行处理.如果文件的内容符合某些条件,我必须对文件系统进行一系列操作(比如读写几个文件),然后执行done函数.如果条件失败,我必须跳过所有系列操作,我必须done直接执行该功能.

result在所有then函数中返回一个对象(比如说),然后then我更新result并返回它.所以,当所有的then事情都完成后,done就会有所累积result.最后,done将处理result并打印它.

因此,如果最初不满足条件,done则只需打印result(这将是空的).

Q()
.then(readFile)
.then(function (contents) {
    var processResult = process the contents;
    if (processResult) {
        return {};
    } else {
        // How can I skip to `done` from here
    }
})
.then(function (results) {
    // do some more processing and update results
    return …
Run Code Online (Sandbox Code Playgroud)

javascript node.js promise q

26
推荐指数
2
解决办法
8931
查看次数

删除嵌套的promise

我是承诺并使用NodeJS中的请求和承诺编写网络代码的新手.

我想删除这些嵌套的promises并将它们链接起来,但我不确定我是怎么做的/它是否是正确的方法.

exports.viewFile = function(req, res) {
var fileId = req.params.id;
boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken)
    .then(function(response) {
        boxViewerRequest('documents', {url: response.request.href}, 'POST')
            .then(function(response) {
                boxViewerRequest('sessions', {document_id: response.body.id}, 'POST')
                    .then(function(response) {
                        console.log(response);
                    });
            });
    });
};
Run Code Online (Sandbox Code Playgroud)

这是请求代码:

var baseContentURL = 'https://api.box.com/2.0/';
var baseViewerURL = 'https://view-api.box.com/1/';

function boxContentRequest(url, accessToken) {
    return new Promise(function (resolve, reject) {
            var options = {
                url: baseContentURL + url,
                headers: {
                    Authorization: 'Bearer ' + accessToken,
                }
            };
      request(options, function (err, res) {
        if (err) { …
Run Code Online (Sandbox Code Playgroud)

javascript request node.js promise

19
推荐指数
1
解决办法
4454
查看次数

如何打破承诺链

我是这样的承诺,

function getMode(){
    var deferred = Promise.defer();

    checkIf('A')
    .then(function(bool){
        if(bool){
            deferred.resolve('A');
        }else{
            return checkIf('B');
        }
    }).then(function(bool){
        if(bool){
            deferred.resolve('B');
        }else{
            return checkIf('C');
        }
    }).then(function(bool){
        if(bool){
            deferred.resolve('C');
        }else{
            deferred.reject();
        }
    });

    return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

checkIf返回一个promise,是的checkIf ,无法修改.

我如何在第一场比赛中脱颖而出?(除了明确抛出错误之外的任何其他方式?)

javascript promise selenium-chromedriver selenium-webdriver

12
推荐指数
3
解决办法
2万
查看次数

以推荐的方式停止承诺链执行

我有一个类似于这个的代码:

promise_function().then(()=>{
  //do something
  return another_promise_fucntion();
}).then(() => {
  //do something
  return another_promise_function1();
}).then((result) => {
  //check if result is valid
  if(!result)
     //break chain (how to stop calling the next .then functions ?)
  else
     return another_promise_function2();
}).then(()=>{
   //do something
   return another_promise_function3();
}).catch((err)=>{
   //handle error
});
Run Code Online (Sandbox Code Playgroud)

如果返回的结果无效,我想停止调用下一个.then()函数.

我使用"throw new Error()",它工作得很好,但我不确定它是否是推荐的方式.

javascript promise web es6-promise

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

我可以在蓝鸟Promises的早期打破链条吗?

我不一定要错,但我有:

getFromDb().then (tradeData) ->
  if not tradeData
    # DO NOT CONTINUE THE CHAIN
  else
    getLatestPrice tradeData
.then (latestPrice) ->
  ...
.then ->
  ...
.then ->
  ...
.catch (err) ->
  next err
Run Code Online (Sandbox Code Playgroud)

如果没有tradeData,我有什么方法可以中断链?

javascript promise bluebird

7
推荐指数
2
解决办法
3668
查看次数

解决后如何制止承诺链?

我希望在通过某些条件解决后停止承诺链.下面的代码可能有助于理解我在说什么.

function update(id, data) {
    return new Promise((resolve, reject) => {
        let conn;

        pool.get()
        .then((db) => {
            conn = db;

            if(Object.keys(data).length === 0) {
                return resolve({ updated: 0 });
            }
            else {
                return generateHash(data.password);
            }
        })
        .then((hash) => {
            conn.query("UPDATE ... ", (err, queryResult) => {
                if(err) {
                    throw err;
                }

                resolve({ updated: queryResult.affectedRows });
            });
        })
        .catch((err) => { ... })
    });
}
Run Code Online (Sandbox Code Playgroud)

请注意,pool.get()是promise包装的API,用于从我创建的MySQL模块获取连接池.

我正在尝试做的是更新用户数据.并且为了节省服务器资源,如果没有要更新的数据,我避免更新(Object.keys(data).length === 0).

当我尝试这个代码时,即使没有数据要更新,第二个(更新数据库)总是会发生!

我读过这篇文章,但没有奏效.当我调用"return resolve();"时为什么没有停止承诺链?我该如何正确地阻止它?我真的很喜欢使用Promises,但有时候,这种事情会让我发疯.非常感谢帮助我解决这个问题.谢谢!

PS无论如何,我正在使用节点v6.2.2.

javascript node.js promise

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

jQuery链接和级联然后是什么时候

我目前在我面前有一个非常棒的if-then-else循环,它首先从web服务获得多个cantinas.然后它会获得所有可用餐点(每个菜单)和所有可用的配菜(每个菜单).对于每一餐和两餐,然后检查所有添加剂并聚集它们.

最后,我有多种菜单,包括餐点,配菜和所有添加剂.

以下流程图显示了该过程:
在此输入图像描述

我想美化代码,并希望使用jQuery的promises - 但我无法弄清楚如何做到这一点,因为我必须在a then之后堆叠when(至少我认为,也许我必须resolve?).以下是我最好的尝试:

//this totally does not work at all, but you get the idea what I want to do
Menus.getCantinas()
       .when(Menus.getMeals(cantinas), Menus.getSides(cantinas)) //when doesn't exist here, neither does cantinas
         .then(Menus.getAdditives(meals, sides) //also throws errors as meals and sides does not exist
           .done(function(cantinas, meals, sides, additives) { //more errors for the people
             Menus.cantinas = cantinas;
             Menus.meals = meals;
             Menus.sides = sides;
             Menus.additives = additives;

             //... some html stuff to build …
Run Code Online (Sandbox Code Playgroud)

javascript jquery chaining promise jquery-deferred

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