标签: bluebird

如何将回调转化为承诺?

考虑到这个例子:

app.get('/url/:param', function(req, res, next) {
  var param = req.params.param;
  method1(param, function(err, model) {
    if(err) return next(err);
    method2(model, function(err, models) {
      if(err) return next(err);
      if(models.length > 0) {
        method3(mode, models, function(err, models2) {
          res.render("index.html", {model: model, models: models, models2: models2});
        });
      } else {
        res.render("index.html", {model: model, models: models});
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用promises简化这个例子?看看所有方法都是dependents并且有类似的验证.if(models.length > 0) 此外,我需要res.render在一个独特的地方进行分组.

javascript callback promise express bluebird

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

在什么情况下蓝鸟的"可能未处理的错误"警告可能是错误的?

"可能"一词表明,在某些情况下,即使您自己发现错误,也可以在控制台中收到此警告.

这些情况是什么?

javascript bluebird

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

有没有一种方法可以结合Bluebird的`then`和`catch`功能?

鉴于,我有一些像这样的代码:

// code bits to be executed
var X = ...;
var pre = ...;
var success = ...;
var error = ...;
var post = ...;
Run Code Online (Sandbox Code Playgroud)

我会像这样用Bluebird运行它:

X
.then(function(val) {
    pre(val);
    success(val);
    post(val);
})
.catch(function(err) {
    pre();
    error(err);
    post();
});
Run Code Online (Sandbox Code Playgroud)

我正在寻找更简单的东西(在那里,我可以定义更少的functions),沿着这样的方向:

X
.complete(function(err, val) {
    pre(val);
    if (err) {
        error(err);
    }
    else {
        success(val);
    }
    post(val);
});
Run Code Online (Sandbox Code Playgroud)

请注意,我无法使用finally,因为它没有参数,也err没有val.另请注意,val假设是nullundefined出现错误.

PS:我想的越多,我就越觉得CoffeeScript可以修复冗长问题,同时保持整洁干净(保持if外观并保持"可链接")......

javascript promise bluebird

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

将promise转换为同步函数

如果我有一个像下面这样的简单函数,addTwo我可以使用bluebird Promise.method(addTwo)来使它成为一个承诺,即使它不执行任何异步操作.有没有办法对此做相反的事情?

function addTwo(num){
  return num + 2
}

var newValue = addTwo(2) // => 4

addTwoPromise = Promise.method(addTwo)

addTwoPromise(2).then(function(newValue){
  console.log(newValue) // == 4
})
Run Code Online (Sandbox Code Playgroud)

有没有办法再次addTwoPromise从承诺转换为同步功能?我知道关于异步/等待的所有内容,我不是那样寻找答案.

javascript promise bluebird

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

有条件地完成链条承诺

我有一个Promise链,我执行了许多操作.当我达到某个then陈述时,我想创建一个可以继续链的分叉,否则,将解决整个即将到来的承诺链.

readFile('example.json').then(function (file) {
    const entries = EJSON.parse(file);
    return Promise.each(entries, function (entry) {
      return Entries.insertSync(entry);
    });
  }).then(function () {
    if (process.env.NODE_ENV === 'development') {
      return readFile('fakeUsers.json');
    } else {
      // I am done now. Finish this chain.
    }
  })
  // conditionally skip these.
  .then(() => /** ... */)
  .then(() => /** ... */)
  // finally and catch should still be able to fire
  .finally(console.log.bind('Done!'))
  .catch(console.log.bind('Error.'));
Run Code Online (Sandbox Code Playgroud)

这可能与承诺有关吗?

javascript node.js promise ecmascript-6 bluebird

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

记录时避免使用Promise构造函数反模式

我正在看这个问题,答案是有道理的

什么是明确的承诺构建反模式,我该如何避免它?

但是,如果你只想简单地在函数中添加一条日志消息或者简单的东西有什么方法可以避免创建像这样的新承诺

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        // using a promise constructor
        myPromiseFn(param+1)
        .then(function(val) {
            console.log("getStuffDone executing");
            resolve(val);
        }).catch(function(err) {
            console.log("getStuffDone error");
            reject(err);
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

如果你想在这个位置运行promise之前想要一条日志消息怎么办?这会让事情变得更加困难吗?

function getStuffDone(param) {
    return new Promise(function(resolve, reject) {
        // using a promise constructor
        console.log("getStuffDone starting");
        myPromiseFn(param+1)
        .then(function(val) {
            console.log("getStuffDone executing");
            resolve(val);
        }).catch(function(err) {
            console.log("getStuffDone error");
            reject(err);
       });
   });
}
Run Code Online (Sandbox Code Playgroud)

javascript promise bluebird

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

产生的价值不能被视为承诺

我正在使用Koa和Bluebird并正在尝试协同程序.我发现下面给出了一个错误.但如果我替换yield initRouters()它的内容initRouters()工作.这是为什么?

'use strict';

const fs = require('fs');
const Promise = require('bluebird');
const readdir = Promise.promisify(fs.readdir);

let app = require('koa')();

let initRouters = function *() {
  const routerDir = `${__dirname}/routers`;
  let routerFiles = yield readdir(routerDir);
  return Promise.map(routerFiles, function *(file) {
    var router = require(`${routerDir}/${file}`);

    app
      .use(router.routes())
      .use(router.allowedMethods());
  });
}

Promise.coroutine(function *() {
  yield initRouters();

  const PORT = process.env.PORT || 8000;
  app.listen(PORT);
  console.log(`Server listening on ${PORT}`);
})();
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

Unhandled rejection TypeError: A value [object Generator] was yielded …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6 bluebird koa

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

在Promise.all(ES6和Bluebird)的可能性

这个安全装置是否必要?

Promise.all([...].map((thenable) => Promise.resolve(thenable)));
Run Code Online (Sandbox Code Playgroud)

是否有可能和安全供应thenables到采集方法- Promise.all,Promise.race等?任何陷阱?

问题涉及Bluebird,以及polyfilled和所有本机ES6承诺实现.

javascript promise bluebird es6-promise

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

值转换为字符串失败

我有这个问题 我很累 我无法解决这个问题Cast to string failed for value \"{}\" at path \"post\

{
  "confirmation": "fail",
  "message": {
    "message": "Cast to string failed for value \"{}\" at path \"post\"",
    "name": "CastError",
    "stringValue": "\"{}\"",
    "kind": "string",
    "value": {

    },
    "path": "post"
  }
}
Run Code Online (Sandbox Code Playgroud)

希望你能帮助我

索引.html

    <h1>CreateComment</h1>
    <form action="/api/comment" method="post">
      <input type="text" name="post" placeholder="Post" /><br />
      <input type="text" name="text" placeholder="Text"><br />
      <input type="submit" value"Create" />
    </form>
Run Code Online (Sandbox Code Playgroud)

评论.js

var mongoose = require('mongoose')

var CommentSchema = new mongoose.Schema({
  profile: {type: mongoose.Schema.Types.Mixed, default: {}},
  post: …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose node.js express bluebird

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

如何使用promise做序列任务?

所以,我有4项任务:getStatus(),updateStatus(A),getTask(),updateTask(),它应该以这种方式执行:

getStatus(function(status) {
  // A
  updateStatus(status, function(status) {
    // B
    getTask(function(task) {
      // C
      updateTask(task, function(task) {
        // D
      })
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

所以为了避免回调地狱,我用了诺言,现在所有这四个任务都返回了一个Promise,然后我改成了这个方式

getStatus().then(function(status) {
  // A
  updateStatus(status).then(function(status) {
    // B
    getTask().then(function(task) {
      // C
      updateTask(task).then(function(task) {
        //D
      })
    })
  }) 
}) 
Run Code Online (Sandbox Code Playgroud)

如你所见,它仍然有then hell,

我对Promise做错了吗?

javascript node.js promise bluebird

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