Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用javascript干掉承诺_Javascript_Node.js_Promise_Generator - Fatal编程技术网

用javascript干掉承诺

用javascript干掉承诺,javascript,node.js,promise,generator,Javascript,Node.js,Promise,Generator,节点v6.3.0中的以下代码运行在一个api上,该api根据POST请求中是否存在参数的条件运行两个单独的承诺 if (paramExists) { // call database with this query User.filter(/* do something with param */) .then(function (user) { Data.filter(/* same in both conditions */)

节点v6.3.0中的以下代码运行在一个api上,该api根据POST请求中是否存在参数的条件运行两个单独的承诺

if (paramExists) {
    // call database with this query
    User.filter(/* do something with param */)
        .then(function (user) {
            Data.filter(/* same in both conditions */)
                .then(function (data) {
                    // join data and user
                    res.send(joinedData);
                })  // omit catch for clarity
        })  // omit catch for clarity
} else {
    // call database with this query
    User.filter(/* do something with header */)
        .then(function (user) {
            Data.filter(/* same in both conditions */)
                .then(function (data) {
                    // join data and user
                    res.send(joinedData);
                })  // omit catch for clarity
        })  // omit catch for clarity
}

我确信有一种方法可以使这段代码干涸,这样两种情况下的第一个承诺都会将用户传递给第二个承诺,但我不知道如何实现。我应该使用发电机,还是有一种方法可以实现我没有得到的承诺?

你可以做如下事情。我假设
Data.filter
也会返回一个承诺

if (paramExists) {
    // call database with this query
    User.filter(/* do something with param */)
        .then(sameCondition);  // omit catch for clarity
} else {
    // call database with this query
    User.filter(/* do something with header */)
        .then(sameCondition);  // omit catch for clarity
}

function sameCondition(user) {
  return Data.filter(/* same in both conditions */)
    .then(function (data) {
      // join data and user
      res.send(joinedData);
  });  // omit catch for clarity
}

你可以做如下的事情。我假设
Data.filter
也会返回一个承诺

if (paramExists) {
    // call database with this query
    User.filter(/* do something with param */)
        .then(sameCondition);  // omit catch for clarity
} else {
    // call database with this query
    User.filter(/* do something with header */)
        .then(sameCondition);  // omit catch for clarity
}

function sameCondition(user) {
  return Data.filter(/* same in both conditions */)
    .then(function (data) {
      // join data and user
      res.send(joinedData);
  });  // omit catch for clarity
}

像这样做

var task1 = paramExists ? 
   User.filter(/* do something with param */) :
   User.filter(/* do something with header */)

var doFilter = task1.then(function () {
   return Data.filter(/* same in both conditions */)
})

doFilter.then(function (joinedData) {
   res.send(joinedData);
});

像这样做

var task1 = paramExists ? 
   User.filter(/* do something with param */) :
   User.filter(/* do something with header */)

var doFilter = task1.then(function () {
   return Data.filter(/* same in both conditions */)
})

doFilter.then(function (joinedData) {
   res.send(joinedData);
});

由于两个分支之间唯一不同的部分是传递给
User.filter()
,因此可以将该值放入条件中的局部变量中,然后使用该变量运行一个版本的代码

您还可以简化链接方法,以删除不必要的嵌套:

var arg; 
if (paramExists) {
    arg = ...     // some logic
} else {
    arg = ...     // some different logic
}
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...);
}).then(function (data) {
    // join data and user
    res.send(joinedData);
});  // omit catch for clarity
您也可以使用三元:

var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...);
}).then(function (data) {
    // join data and user
    res.send(joinedData);
});  // omit catch for clarity

如果您需要访问
用户
数据
来发送响应(在伪代码中有点难说),那么您可以保留嵌套:

var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...).then(function(data) {
        // join data and user
        res.send(joinedData);
    });
});  // omit catch for clarity

由于两个分支之间唯一不同的部分是传递给
User.filter()
,因此可以将该值放入条件中的局部变量中,然后使用该变量运行一个版本的代码

您还可以简化链接方法,以删除不必要的嵌套:

var arg; 
if (paramExists) {
    arg = ...     // some logic
} else {
    arg = ...     // some different logic
}
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...);
}).then(function (data) {
    // join data and user
    res.send(joinedData);
});  // omit catch for clarity
您也可以使用三元:

var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...);
}).then(function (data) {
    // join data and user
    res.send(joinedData);
});  // omit catch for clarity

如果您需要访问
用户
数据
来发送响应(在伪代码中有点难说),那么您可以保留嵌套:

var arg = paramExists ? someLogic : someOtherLogic;
// call database with this query
User.filter(arg).then(function (user) {
    return Data.filter(...).then(function(data) {
        // join data and user
        res.send(joinedData);
    });
});  // omit catch for clarity

您可以更简单,只需根据条件向第一个承诺传递不同的参数,例如,
User.filter(paramExists?args1:args2)
看起来很简单,让我试试。您可以更简单,只需根据条件将不同的参数传递给第一个承诺,例如,
User.filter(paramExists?args1:args2)。然后(restOfBehavior)看起来很简单,让我试试。你考虑过
承诺吗。所有的
。它最终看起来像
var p1=User.filter(paramExists?args1:args2),p2=Data.filter(…);所有([p1,p2])。然后(函数(用户,数据){…})
听起来像是你在要求什么?你考虑过
承诺吗。它最终看起来像
var p1=User.filter(paramExists?args1:args2),p2=Data.filter(…);所有([p1,p2])。然后(函数(用户,数据){…})听起来像是你在要求?我想这可能是个问题,因为OP需要将第一个承诺的结果与第二个承诺的结果结合起来,并且使用链式回调方法返回的用户数据超出范围。@numbers131407-我在后面添加了该选项。有时很难在伪代码中说出这种详细程度。或者,他们也可以与其中一个共享同一级别的数据。事实上,第二个选项是有效的。谢谢你,学会热爱承诺。我认为这可能是个问题,因为OP需要将第一个承诺的结果与第二个承诺的结果结合起来,并且使用链式回调方法,返回的用户数据超出范围。@numbers131407-我在后面添加了该选项。有时很难在伪代码中说出这种详细程度。或者,他们也可以与其中一个共享同一级别的数据。事实上,第二个选项是有效的。谢谢你,学会爱承诺。