Я использую Knockout, и я пытаюсь построить функцию, которая вернет значение. Проблема в том, что я вычисляю значение внутри внутренней функции, и я не нахожу способ получить значение из этой функции.
То, что у меня есть до сих пор
JS
var vm = {
myResponse: ko.observable(),
computedValue: ko.observable()
};
vm.myResponse.subscribe(function (newValue) {
myfunction(computedValue);
});
var myfunction = function (observableToUpdate) {
var responses = request.responses();
return changeUp.getUserInfo().then(function (userInfo) {
var currentResponse = ko.utils.arrayFirst(responses, function (r) {
return r.userName === userInfo.userName;
});
var responseindex = responses.indexOf(currentResponse);
observableToUpdate({
responeIndex: responseindex
});
});
};
На моем html я использую следующие строки
<tbody data-bind="foreach: request.responses()">
<tr data-bind="css: { responder : $parent.vm}">
<td>{{since()}}</td>
<td>{{amount|number}}</td>
<td>{{rate|number}}</td>
<td>{{distance}}</td>
<td>
<a data-bind="click: action">{{_t('Details')}}</a>
</tr>
</tbody>
В настоящее время не получают ответчика класса. Я хочу добавить его только в том случае, если условие isMyResponse истинно;
Единственный способ использовать асинхронные обратные вызовы для установки наблюдаемого - это использовать подписки. Вычисленный нокаут ожидает синхронного возвращаемого значения.
Вы выполняете законченное выполнение перед "затем" обратным вызовом.
var someObservable = ko.observable();
var computedValue = ko.observable();
someObservable.subscribe( function( newValue ) {
changeup.getUserInfo().then( function(userInfo) {
...
computedValue(myRespondIndex);
});
} );
Кроме того, "тогда" возвращаемое значение обратного вызова влияет только на цепочку вызовов обещания. Если вы выкинете исключение, срабатывает обратный вызов fail, и никакой прикованный "then" callback не будет вызван. Возвращаемое значение не "каскадируется" через обратные вызовы.
Для UserID = 'undefined'
, я думаю, что результат первого then
функции передается на второй then
функции. Результат второй функции then
будет undefined
как ничего не возвращается. Я думаю, что это должно быть примерно так:
this.isMyResponse = function(index) {
var test ;
var responses = this.request.responses();
var useriD = changeup.getUserInfo().then(function (userInfo) {
var currentResponse = ko.utils.arrayFirst(responses, function (r) {
return r.username === userInfo.username;
});
var myRespondIndex = responses.indexOf(currentResponse);
test = myRespondIndex;
console.log("inside" + test);
return myRespondIndex;
}).then (function (index) {
console.log("outside" + test);
return index;
});
console.log("outside" + test);
return test;
}
РЕДАКТИРОВАТЬ
Следующая jsFiddle была моей попыткой подтвердить то, что рассказывал мне Роберт Стэнли. В конце концов я внедрил решение, как он предложил.
http://jsfiddle.net/gonefishern/zdDh9/
Как заметил мне Роберт Стэнли, следующий javascript вернет обещание, но не те ценности, которые, как я думал, собирались.
var isMyResponse = function(observableToUpdate) {
var responses = this.request.responses();
return changeup.getUserInfo().then(function (userInfo) {
var currentResponse = ko.utils.arrayFirst(responses, function (r) {
return r.username === userInfo.username;
});
return {
responeIndex: responses.indexOf(currentResponse),
userInfo: userInfo
};
});
}
console.log("outside" + test);
что-то еще, чтобы увидеть, если это так.