Как получить значение из функции Knockout

0

Я использую 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 истинно;

  • 0
    Похоже, что вы используете обещания, поэтому я подозреваю, что это проблема порядка выполнения для вашей регистрации. В качестве теста смените один из console.log("outside" + test); что-то еще, чтобы увидеть, если это так.
  • 0
    @NathanFisher НатанФишер правильно. getUserInfo должен быть асинхронным методом. Если вы посмотрите на порядок записи в консоли, то увидите, что обратные вызовы «2» выполняются ПОСЛЕ того, как возвращается метод, поэтому «test» все еще не определен в операторе return. Вы не можете использовать этот подход, чтобы вернуть значение для вычисленного.
Показать ещё 2 комментария
Теги:
knockout.js

2 ответа

1

Единственный способ использовать асинхронные обратные вызовы для установки наблюдаемого - это использовать подписки. Вычисленный нокаут ожидает синхронного возвращаемого значения.

Вы выполняете законченное выполнение перед "затем" обратным вызовом.

var someObservable = ko.observable();
var computedValue = ko.observable();

someObservable.subscribe( function( newValue ) {
    changeup.getUserInfo().then( function(userInfo) {
        ...
        computedValue(myRespondIndex);
    });
} );

Кроме того, "тогда" возвращаемое значение обратного вызова влияет только на цепочку вызовов обещания. Если вы выкинете исключение, срабатывает обратный вызов fail, и никакой прикованный "then" callback не будет вызван. Возвращаемое значение не "каскадируется" через обратные вызовы.

0

Для 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
         };
    });
}
  • 0
    Две функции обратного вызова «then» выполняются асинхронно после возврата метода.
  • 0
    Да, я знаю. проблема заключалась в том, почему идентификатор пользователя не был определен
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню