Как определить порядок добавления аргументов через .bind()

Предисловие, я использую BlueBird, чтобы переписать код из обратных вызовов в Promises (Bluebird — это круто, кстати), и я пытаюсь реорганизовать свой код:

У меня есть функция, которая будет использоваться в другой ситуации, вот эта:

var getPackagesWithIndex = function(request, indexName, indexValue){
  return new Promise(function(resolve, reject){
    Package.query(indexValue).usingIndex(indexName).exec(
      function(err, data){
        if (err) return reject(err);
        // Add the request to the payload
        data.request_ota = request;
        resolve(data);
    });
  })
}

Я связываю такие функции, чтобы получить желаемый результат:

var promote = function(request){
  var destination_build = request.params.destination_build;
  return sanitizeInput(request
    ).then(getPackagesWithIndex.bind(undefined, destination_build, 'destination_build')
    ).then(preparePackages
    ).mapSeries(updatePackage)
}

когда я console.log результат, порядок аргументов кажется перепутанным: request получил значение indexValue, есть ли способ сохранить порядок?


person e-nouri    schedule 09.11.2015    source источник
comment
getPackagesWithIndex будет вызываться с request == request.params.destination_build, indexName == 'destination_build' и indexValue == resolved value of promise, возвращаемыми в функции sanitizeInput   -  person Jaromanda X    schedule 09.11.2015


Ответы (1)


Первый аргумент метода bind (которое не имеет ничего общего с Bluebird, кстати) — это значение this для вызова функции. Хотя аргументы остаются упорядоченными.

Поэтому, когда вы используете getPackagesWithIndex.bind(undefined, destination_build, 'destination_build') в качестве обратного вызова then, тогда getPackagesWithIndex в конечном итоге будет вызываться с

  • this контекст undefined
  • a request of destination_build
  • an indexName of 'destination_build'
  • и indexValue с обещанным результатом

Если это просто сдвинуто, добавьте что-то вроде null впереди; если вам нужен совершенно другой порядок, вам лучше использовать функциональное выражение, содержащее явный вызов.

person Bergi    schedule 09.11.2015
comment
Да, я знаю, что первый аргумент таков, я думаю, я не понял, что связанный аргумент был добавлен в конце, а не в начале, спасибо, Берги и @Jaromanda-X. Да, в итоге я сделал что-то вроде: .then(function(request){ // Data already cleaned var destination_build = request.params.destination_build; return getPackagesWithIndex(request, 'destination_build', destination_build) }) - person e-nouri; 09.11.2015