执行中间操作并在bluebird中继承先前的结果

时间:2017-03-01 08:44:34

标签: javascript promise bluebird

是否有一种速记可以获得Promise的价值并将其推向承诺链而不明确地返回它?

换句话说,bluebird中是否有以下的简写语法:

var syntaxTree = CSharpSyntaxTree.ParseText(usercode,
    new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.None, SourceCodeKind.Script));
var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var userlib = MetadataReference.CreateFromFile(userlibPath);

var compilation = CSharpCompilation.Create("MyCompilation",
            syntaxTrees: new[] { syntaxTree }, references: new[] { mscorlib, userlib });

var model = compilation.GetSemanticModel(syntaxTree);

2 个答案:

答案 0 :(得分:1)

你可以使用箭头功能体内的Comma operator(不带花括号):

.then(result => (callSomething(result), result)

逗号运算符

  

计算每个操作数(从左到右)并返回最后一个操作数的值。

因此,result由表达式返回:

(callSomething(result), result)

然后,没有花括号的箭头函数返回指定为其主体的表达式的值。因此,返回result

答案 1 :(得分:1)

如果您经常使用此模式,为什么不为它制作通用方法

Promise.prototype.skip = function skip(fn, onRejected) {
    return this.then(value => Promise.resolve(fn(value)).then(() => value), onRejected);
};

让我们说你的例子callSomething返回一个承诺

function callSomething(v) {
    console.log('skip got', v);
    // this promise will be waited for, but the value will be ignored
    return new Promise(resolve => setTimeout(resolve, 2000, 'wilma'));
}

现在,b使用skip代替then,传入的已实现值(在本例中为fred)将仅传递以下then,但在此之后callSomething返回的承诺已履行

Promise.resolve('fred').skip(callSomething).then(console.log); // outputs "fred"

但是,如果callsomething没有返回承诺,则无关紧要